stylecontext: NMake safe to call into during lookup
authorBenjamin Otte <otte@redhat.com>
Tue, 3 Jan 2012 03:36:11 +0000 (04:36 +0100)
committerBenjamin Otte <otte@redhat.com>
Mon, 9 Jan 2012 17:37:57 +0000 (18:37 +0100)
When resolving a lookup, we may want to query the current style context,
as in the next patch. This works now.

gtk/gtkcsslookup.c
gtk/gtkcsslookupprivate.h
gtk/gtkstylecontext.c

index ff833cb0fb75d76d2d29189774fde823a96c5c6a..ef075d37d64dad5c74cbbbea0bf2ce2870748d98 100644 (file)
@@ -107,29 +107,28 @@ _gtk_css_lookup_set (GtkCssLookup  *lookup,
  * _gtk_css_lookup_resolve:
  * @lookup: the lookup
  * @context: the context the values are resolved for
+ * @props: a new #GtkStyleProperties to be filled with the new properties
  *
  * Resolves the current lookup into a styleproperties object. This is done
  * by converting from the "winning declaration" to the "computed value".
  *
  * XXX: This bypasses the notion of "specified value". If this ever becomes
  * an issue, go fix it.
- *
- * Returns: a new #GtkStyleProperties
  **/
-GtkStyleProperties *
-_gtk_css_lookup_resolve (GtkCssLookup    *lookup,
-                         GtkStyleContext *context)
+void
+_gtk_css_lookup_resolve (GtkCssLookup       *lookup,
+                         GtkStyleContext    *context,
+                         GtkStyleProperties *props)
 {
-  GtkStyleProperties *props;
   GtkStyleContext *parent;
   guint i, n;
 
-  g_return_val_if_fail (lookup != NULL, NULL);
-  g_return_val_if_fail (GTK_IS_STYLE_CONTEXT (context), NULL);
+  g_return_if_fail (lookup != NULL);
+  g_return_if_fail (GTK_IS_STYLE_CONTEXT (context));
+  g_return_if_fail (GTK_IS_STYLE_PROPERTIES (props));
 
   parent = gtk_style_context_get_parent (context);
   n = _gtk_css_style_property_get_n_properties ();
-  props = gtk_style_properties_new ();
 
   for (i = 0; i < n; i++)
     {
@@ -219,6 +218,4 @@ _gtk_css_lookup_resolve (GtkCssLookup    *lookup,
                                                       &value);
       g_value_unset (&value);
     }
-
-  return props;
 }
index 79e557868645963a9bf466d109da008550520c77..90cf0cf6df641d018710776ee692714074a2213b 100644 (file)
@@ -41,8 +41,9 @@ void                    _gtk_css_lookup_set                     (GtkCssLookup
                                                                  guint               id,
                                                                  GtkCssSection      *section,
                                                                  const GValue       *value);
-GtkStyleProperties *    _gtk_css_lookup_resolve                 (GtkCssLookup       *lookup,
-                                                                 GtkStyleContext    *context);
+void                    _gtk_css_lookup_resolve                 (GtkCssLookup       *lookup,
+                                                                 GtkStyleContext    *context,
+                                                                 GtkStyleProperties *props);
 
 
 G_END_DECLS
index be0fb8a666d9e7928774e2b4f43ac7d3db0511bb..b53f82c1b405e9e6bea0ca6651cdffda830c8cfc 100644 (file)
@@ -987,10 +987,11 @@ build_properties (GtkStyleContext *context,
         }
     }
 
-  style_data->store = _gtk_css_lookup_resolve (lookup, context);
+  style_data->store = gtk_style_properties_new ();
   _gtk_style_properties_set_color_lookup_func (style_data->store,
                                                gtk_style_context_color_lookup_func,
                                                context);
+  _gtk_css_lookup_resolve (lookup, context, style_data->store);
   _gtk_css_lookup_free (lookup);
 }
 
@@ -1091,44 +1092,40 @@ style_data_lookup (GtkStyleContext *context,
       gtk_style_context_set_state (context, state);
     }
 
-  data = g_hash_table_lookup (priv->style_data, priv->info_stack->data);
+  priv->current_data = g_hash_table_lookup (priv->style_data, priv->info_stack->data);
+  priv->current_state = state;
 
-  if (!data)
+  if (!priv->current_data)
     {
       GtkWidgetPath *path;
 
-      data = style_data_new ();
-      path = create_query_path (context);
-
-      build_properties (context, data, path, state);
-      build_icon_factories (context, data, path);
-
+      priv->current_data = style_data_new ();
       g_hash_table_insert (priv->style_data,
                            style_info_copy (priv->info_stack->data),
-                           data);
+                           priv->current_data);
+
+      path = create_query_path (context);
+
+      build_properties (context, priv->current_data, path, state);
+      build_icon_factories (context, priv->current_data, path);
 
       gtk_widget_path_free (path);
     }
 
-  if (G_UNLIKELY (state_mismatch))
-    {
-      gtk_style_context_restore (context);
-    }
-  else
-    {
-      if (priv->theming_engine)
-        g_object_unref (priv->theming_engine);
+  data = priv->current_data;
 
-      gtk_style_properties_get (data->store, 0,
-                                "engine", &priv->theming_engine,
-                                NULL);
+  if (priv->theming_engine)
+    g_object_unref (priv->theming_engine);
 
-      if (!priv->theming_engine)
-        priv->theming_engine = g_object_ref (gtk_theming_engine_load (NULL));
-    }
+  gtk_style_properties_get (priv->current_data->store, 0,
+                            "engine", &priv->theming_engine,
+                            NULL);
 
-  priv->current_data = data;
-  priv->current_state = state;
+  if (!priv->theming_engine)
+    priv->theming_engine = g_object_ref (gtk_theming_engine_load (NULL));
+
+  if (G_UNLIKELY (state_mismatch))
+    gtk_style_context_restore (context);
 
   return data;
 }